package memento;

import java.util.Stack;

public class ControladorDeAcciones implements IControladorDesReHacer {
	
	private Stack<IMemento> estadosParaDeshacer;
	private Stack<IMemento> estadosParaRehacer;
	
	private boolean seHizoUnCambio;
	
	public ControladorDeAcciones() {
		this.inicializar();
	}

	private void inicializar()
	{
		this.estadosParaDeshacer = new Stack<IMemento>();
		this.estadosParaRehacer = new Stack<IMemento>();
		this.seHizoUnCambio = false;
	}

	public boolean hayCosasParaDeshacer(){
		return (!this.estadosParaDeshacer.isEmpty());
	}
	
	public boolean hayCosasParaRehacer(){
		return (!this.estadosParaRehacer.isEmpty());
	}
	
	public void deshacer()
	{
		if (this.hayCosasParaDeshacer() == false)
			return;
		
		IMemento memento = this.estadosParaDeshacer.pop();
		IMemento mementoNuevo = memento.getGuardable().getMementoGenerico();
		memento.cargarMemento();
		this.estadosParaRehacer.push(mementoNuevo);
	}
	
	public void rehacer()
	{
		if (this.hayCosasParaRehacer() == false)
			return;
		
		IMemento memento = this.estadosParaRehacer.pop();
		IMemento mementoNuevo = memento.getGuardable().getMementoGenerico();
		memento.cargarMemento();
		this.estadosParaDeshacer.push(mementoNuevo);
	}
	
	public void reiniciar(){
		this.inicializar();
	}
	
	public void guardarCambio(IMemento memento){
		this.estadosParaDeshacer.push(memento);
		this.seHizoUnCambio = true;
	}
	
	public boolean huboCambios(){
		return this.seHizoUnCambio;
	}
		
	public void borrarObjetosParaRehacer() {
		this.estadosParaRehacer = new Stack<IMemento>();
	}
}
